package com.thenetcircle.comsumerdispatcher.jmx; import java.io.IOException; import java.lang.management.ManagementFactory; import java.rmi.registry.LocateRegistry; import javax.management.MBeanServer; import javax.management.ObjectName; import javax.management.remote.JMXConnectorServer; import javax.management.remote.JMXConnectorServerFactory; import javax.management.remote.JMXServiceURL; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.thenetcircle.comsumerdispatcher.config.DispatcherConfig; import com.thenetcircle.comsumerdispatcher.config.MonitorConf; public class ConsumerDispatcherMonitor { private static Log _logger = LogFactory.getLog(ConsumerDispatcherMonitor.class); private static final String fmtUrl = "service:jmx:rmi:///jndi/rmi://%s:%d/jmxrmi"; public static void enableMonitor() { try { enableJMXRmi(); } catch (IOException e) { e.printStackTrace(); } maybeEnableJMXHttp(); } protected static void enableJMXRmi() throws IOException { MonitorConf config = DispatcherConfig.getInstance().getMonitorConf(); LocateRegistry.createRegistry(config.getJmxRmiPort()); MBeanServer server = ManagementFactory.getPlatformMBeanServer(); String address = String.format(fmtUrl, config.getJmxRmiHost(), config.getJmxRmiPort()); JMXServiceURL url = new JMXServiceURL(address); JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server); cs.start(); _logger.info("JMX enabled on:" + address); } /** * enabled if mx4j is in classpath */ protected static boolean maybeEnableJMXHttp() { try { MonitorConf config = DispatcherConfig.getInstance().getMonitorConf(); MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName processorName = new ObjectName("Server:name=XSLTProcessor"); Class<?> httpAdaptorClass = Class.forName("mx4j.tools.adaptor.http.HttpAdaptor"); Object httpAdaptor = httpAdaptorClass.newInstance(); httpAdaptorClass.getMethod("setHost", String.class).invoke(httpAdaptor, config.getJmxHttpHost()); httpAdaptorClass.getMethod("setPort", Integer.TYPE).invoke(httpAdaptor, config.getJmxHttpPort()); ObjectName httpName = new ObjectName("system:name=http"); mbs.registerMBean(httpAdaptor, httpName); Class<?> xsltProcessorClass = Class.forName("mx4j.tools.adaptor.http.XSLTProcessor"); Object xsltProcessor = xsltProcessorClass.newInstance(); httpAdaptorClass.getMethod("setProcessor", Class.forName("mx4j.tools.adaptor.http.ProcessorMBean")). invoke(httpAdaptor, xsltProcessor); mbs.registerMBean(xsltProcessor, processorName); httpAdaptorClass.getMethod("start").invoke(httpAdaptor); _logger.info("mx4j successfuly loaded at " + config.getJmxHttpHost() + ":" + config.getJmxHttpPort()); return true; } catch (ClassNotFoundException e) { _logger.info("Will not load MX4J, mx4j-tools.jar is not in the classpath"); } catch(Exception e) { _logger.warn("Could not start register mbean in JMX", e); } return false; } }